#ifndef __kraw_Renderer_h__
#define __kraw_Renderer_h__

#include <string>

#define renderer Renderer::getInstance()

namespace kraw
{
	class Material;
	class Renderer
	{
	public:
		static void init();

		static Renderer* getInstance();

		//void bindVertexArray(float* vertices, int components = 3, int stride = 0)
		//void bindTexcoordArray(float* texcoords, int components = 2, int stride = 0)
		//void bindColorArray(uint* colors, int components = 4, int stride = 0);

		//void bindMaterial(Material* material);
		//void bindTexture(const char* name, int textureID);
		//void bindTexture(Texture* texture);//int textureID);
		//void bindTextureAt(Texture* texture /*int textureID*/, int texIndex);

		//void setBlendEnabled(bool enabled);
		//void setBlendMode(EBlendMode srcMode, EBlendMode dstMode);

		//void setDepthWrite(bool enabled);
		//void setDepthTest(bool enabled);
		//void setDepthFunc(EDepthFunc depthFunc);

		//void setCullFace(bool enabled);

		//void setClearColor(Color color);
		//void clear(int flags);

		//currently bound material + save global
		//void setFloat(const char* name, float value);
		//void setColor(const char* name, const Color& value);
		//void setVector(const char* name, const vec4& value);
		//void setMatrix(const char* name, const mat4& value);
		//void setMatrixArray(const char* name, const mat4* value);
		
		//void setTransform(ETransformType type, const mat4& value);
		//const mat4& getTransform(ETransformType type);
		//const Frustum& getFrustum();

		//int getPrimitiveCount(EPrimitiveType type);
		//void drawArrays(EPrimitiveType type, int count); //draw primitives
		//void drawElements(EPrimitiveType type, int count); //draw indexed primitives

	private:
		static Renderer* instance;
	};
}

#endif
